﻿using System;

namespace _36_文件操作_Path //Path 路径、目录
{
    class Program
    {
        static string str = "123";
        static void Main(string[] args)
        {
            var tp = new TestPath();
           tp.AboutExtension();
            tp.AboutPath();
            tp.AboutSeparator();

        }


    }

    // Path: 路径，在这里指的是系统文件夹的路径，形如：”D:\Study\Folder1“
    class TestPath
    {
        const string path = @"D:\Study\1.txt";

        /// <summary>
        /// 关于扩展名 和 文件名
        /// <br>About : 关于；extension:扩展名</br>
        /// </summary>
        public void AboutExtension()
        {
            //1. 获取扩展名： 返回指定路径中包含的扩展名，包括了 点号”.“
            string ge = Path.GetExtension(path);
            Console.WriteLine($"获取扩展名:{ge}");

            //2. 获取文件名
            // get:得到；file：文件; name ：名字 
            // 没有后缀名也凑效
            string gf = Path.GetFileName(path);
            Console.WriteLine($"获取文件名:{gf}");

            //3. 修改扩展名：
            // 只是对路径的字符串进行了修改，不会真的改动到这个路径下的文件
            // change : 改变
            var np = Path.ChangeExtension(path, ".exe");
            Console.WriteLine($"修改扩展名{np}");

            // 判断是否包含扩展名
            //path = "D:/Study/1.exe/";  // false 
           string  path0 = "D:/Study/1.exe"; // true
            Console.WriteLine($"包含扩展名= {Path.HasExtension(path0)}");
        }

        /// <summary>
        /// 关于路径
        /// </summary>
        public void AboutPath()
        {
            string path = "D:/Study";
            // Combine: 拼接，Path.Combine ：路径拼接
            //  一旦参数不合理，返回原来的路径
            //string cp = Path.Combine(path, "55.exe",path); // NG 
            //string cp = Path.Combine(path, "55.exe","66.exe","aa/bb","D:/AA"); //NG : 如果出现参数带磁盘，这个参数前面拼接的信息作废
            string cp = Path.Combine(path, "55.exe","66.exe","D:/cc","aa/bb"); //OK , 返回：D:/cc/aa/bb
           //string cp = Path.Combine(path, "55.exe","66.exe","aa/bb"); // OK ,常规写法
            Console.WriteLine($"拼接的路径为：{cp}");

            path = "D:/Study/1.txt/";
            // directory : 文件夹 （目录）
            // 返回 最后一个路径分隔符（\ /）之前的内容
            string?  gdn=Path.GetDirectoryName(path);
            Console.WriteLine($"得到路径名（目录）：{gdn}");

            path = "D:/Study/1.txt.exe";
            // without : 不包含，没有；extension ：扩展
            // 获取文件名，但不包含扩展名
            string gfnwe = Path.GetFileNameWithoutExtension(path);
            Console.WriteLine($"文件名为（不包含扩展名）： {gfnwe}");

            path = "Study/1.txt";
            // full : 全部，饱了
            // 如果 path 没有指定硬盘（路径不完整的时候），返回拼接了程序集所在的路径的路径
            string gfp = Path.GetFullPath(path); //获取完整路径F:\Gitee\csharp-foundation\Bian\36 Csharp 文件操作\bin\Debug\net6.0\Study\1.txt
            // Environment : 环境 ，Process 程序 ； path ： 路径
            Console.WriteLine($"获取完整路径{gfp} \n{Environment.ProcessPath}");

            path = "D:/Study/AAA/1.txt";
            // root :根，源头
            string? rp = Path.GetPathRoot(path);
            Console.WriteLine($"得到路径的根节点; {rp}");

            path = "D:/Study/AAA/1.txt"; // true 
            path = "Study/AAA/1.txt"; //false
            // 是否有根节点
            Console.WriteLine($"是否有根目录 {Path.IsPathRooted(path)}");
        }

        /// <summary>
        /// 关于分隔符
        /// <br>separator : 分隔符</br>
        /// </summary>
        public void AboutSeparator() 
        {
            // se pa ra tor 
            // 获取分隔符
            char c = Path.PathSeparator;
            Console.WriteLine( $"分隔符为：{c}"); // 返回分号”；“

            // 获取硬盘分隔符
            // volume : 卷 （体积、音量），磁盘
            char v = Path.VolumeSeparatorChar;
            Console.WriteLine($"磁盘分隔符为：{v}");

            // 获取目录分隔符
            char ps = Path.DirectorySeparatorChar; //返回 \
            Console.WriteLine($"目录分隔符为：{ps}");

            //获取平台的目录分隔符 （MAC、 PC、安卓、ios）
            char ads = Path.AltDirectorySeparatorChar;
            Console.WriteLine($"PC 平台的目录分隔符为：{ads}"); //返回 /

            // Invalid : 不可用 ，无效、失效
            // 用于声明在构成路径时不能使用在路径名中的字符有哪些
            char[] cs = Path.GetInvalidPathChars();
            // 用于声明在构成路径时不能使用在文件名中的字符有哪些
            char[] cfs = Path.GetInvalidFileNameChars();
            foreach (var item in cs)
            {
                int i = Convert.ToInt32(item);
                Console.WriteLine($"无效路径字符 {i} ");
            }

        }

    }

}